<?php
/**
 * 介绍yii 缓存机制类型的多种用法
 * @author Elwin
 *
 */
class CacheController extends Controller {
	/**
	 * 页面缓存
	 *
	 * 页面缓存也就是把整个页面静态化
	 * 控制器：可以使用COutputCache类作为一个我们控制器类中的一个行为过滤器。
	 *
	 * @return 其中大家可以看到
	 *         COutputCache+index，这里的意思是使用COutputCache类缓存文件，后面的加index指的是只缓存actionIndex函数，如果你需要缓存其他的就继续增加COutputCache+index,hello,test…如果没有后面的+那么默认是缓存整个控制器里面的所有方法
	 *         该filter配置为利用COutputCache过滤器来缓存整个被应用程序
	 *         varyByParam是我们之前提起过的一种很重要的可选项。为了给你减轻压力，减少编写标识被缓存内容key的工作量，该功能允许key被框架自动控制。也就是说，通过指定一系列来自GET参数中的名称。当我们开始请求时，系统将会很好的使用该id作为唯一key的一部分来生成缓存内容。通过指定'varyByParam'=>
	 *         array('id')，COutputCache为我们完成了基于输入请求字符串中id的余下工作 。这里有很多可选项，在我们使用
	 *         COutputCache来缓存数据时，来作为自动生成key名字的策略。下面是可以使用的一个列表：
	 *         •varyByRoute：通过将该选项设置为true，具体请求的路由部分将会作为独立标识符的一部分用于生成缓存数据。所以，你可以使用请求controller和acion的组合来区别缓存内容。
	 *         •varyBySession：通过设置该选项为true，将使用唯一的session
	 *         id来区分缓存中的内容。每个用户的session都是不同的，但是可以用来为缓存服务。
	 *         •varyByParam：如前面所说，这里是用输入的GET中的参数来区分缓存内容。
	 *         •varyByExpression：给该选项设置PHP表达式，我们可以使用相应表达式的结果来区分缓存的内容。
	 */
	public function filters() {
		/*
		 * COutputCache来缓存数据时，来作为自动生成key名字的策略。下面是可以使用的一个列表：
		 * varyByRoute：通过将该选项设置为true，controller/action 已控制器和动作来缓存数据
		 * 具体请求的路由部分将会作为独立标识符的一部分用于生成缓存数据。所以，你可以使用请求controller和acion的组合来区别缓存内容。
		 * varyBySession：通过设置该选项为true，将使用唯一的session true 已session_id来区分key值
		 * id来区分缓存中的内容。每个用户的session都是不同的，但是可以用来为缓存服务。
		 * varyByParam：如前面所说，这里是用输入的GET中的参数来区分缓存内容。$_GET 已GET数据来缓存数据
		 * varyByExpression：给该选项设置PHP表达式，我们可以使用相应表达式的结果来区分缓存的内容。
		 */
		return array (
				array (
						'COutputCache + post, list',// 缓存actionPost,actionList
						'duration' => 600, // 缓存有效时间
						'varyByParam' => array (
								'id' 
						),
						'cacheID' => 'MemCache',
						'varyByParam' => array (
								'id' 
						) 
				) 
		);
	}
	
	/**
	 * 数据库缓存机制使用实例
	 */
	public function actionDbCache() {
		// CDbConnection::cache()
		$sql = 'SELECT * FROM tbl_post LIMIT 20';
		$dependency = new CDbCacheDependency ( 'SELECT MAX(update_time) FROM tbl_post' );
		$rows = Yii::app ()->db->cache ( 1000, $dependency )->createCommand ( $sql )->queryAll ();
		
		// CActiveRecord::cache()
		$dependency = new CDbCacheDependency ( 'SELECT MAX(update_time) FROM tbl_post' );
		$posts = Post::model ()->cache ( 1000, $dependency )->findAll ();
		// 清除所有缓存Yii::app()->cache->flush();
		
	}
	
	/**
	 * 如何知道某一个程序段运行需要的时间
	 * 配置好CProfileLogRoute后，在需要测试的地方加上
	 */
	public function runtime(){
		Yii::beginProfile('blockID');
		// 程序段
		Yii::endProfile('blockID');
	}
	
	/**
	 * 文件缓存机制使用实例
	 */
	public function actionFileCache() {
		Yii::app ()->fcache->add ( 'key', array (
				'filecache' 
		) );
		Yii::app ()->fcache->get ( 'key' );
	}
	/**
	 * memcache缓存机制使用实例
	 */
	public function actionMemCache() {
	}
	
	
	/**
	 * 片段缓存
	 * http://yiiframework.ru/doc/guide/en/caching.fragment
	 * <?php
	 * 片段缓存用来缓存一个页面的一部分。我们可以在view脚本中使用片段缓存。我们通过使用CController::beginCache()和CController::endCache()方法来实现。
	 * …some HTML content… 1.<?php if($this->beginCache('part',array('cacheID'=>'ApcCache'))) { ?>  
	 * <?php if($this—>beginCache($key))?>
	 * …content to be cached…
	 * <?php $this—>endCache(); ?>
	 * …other HTML content…
	 


	if($this->beginCache($id, array('dependency'=>array(
			'class'=>'system.caching.dependencies.CDbCacheDependency',
	        'sql'=>'SELECT MAX(lastModified) FROM Post')))) { 
	
	$this->endCache(); }
	
	<?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?>
...content to be cached...
<?php $this->endCache(); } ?>
	*/
	
	public function actionDb(){
		
		$c = "";
		Yii::app ()->db->dbcache(1000, 'aaaaa')->set('aaaa',$c);
	}
}
?>